package com.summer.safe.service;

import com.summer.safe.base.BaseService;
import com.summer.safe.entity.GenTable;
import com.summer.safe.entity.GenTableColumn;
import com.summer.safe.system.entity.*;
import com.summer.safe.utils.*;
import com.summer.safe.dao.GenTableColumnDao;
import com.summer.safe.dao.GenTableDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 */
@Service
public class GenTableService extends BaseService<GenTableDao, GenTable> {

    @Autowired
    private GenTableColumnDao genTableColumnDao;

    /**
     * 获得当前数据库中的表
     * @param gen
     * @return
     */
    public List<GenTable> findTableList(GenTable gen) {
        return dao.findTableList(gen);
    }

    /**
     * 获得当前数据库中的表
     * @param gen
     * @return
     */
    public List<GenTable> getFindTableList(GenTable gen) {
        return dao.getFindTableList(gen);
    }


    /***
     *根据表名称获得业务表信息
     * @param genTable
     * @return
     */
    public GenTable getGenTableByName(GenTable genTable) {
        return dao.getGenTableByName(genTable);
    }



    public List<GenTableColumn> findTableColumnList(GenTable gen) {
        List<GenTableColumn> genTableColumnList = new ArrayList<>();
        dao.findTableColumnList(gen).forEach(column -> {

            if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "CHAR")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "VARCHAR")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "NARCHAR")) {
                column.setJavaType("String");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "DATETIME")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "DATE")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "TIMESTAMP")) {
                column.setJavaType(Date.class.getName());
                column.setShowType("dateselect");
            } else if (StringUtils.startsWithIgnoreCase(column.getJdbcType(), "BIGINT")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "NUMBER")
                    || StringUtils.startsWithIgnoreCase(column.getJdbcType(), "DECIMAL")) {
                // 如果是浮点型
                String[] ss = StringUtils.split(StringUtils.substringBetween(column.getJdbcType(), "(", ")"), ",");
                if (ss != null && ss.length == 2 && Integer.parseInt(ss[1]) > 0) {
                    column.setJavaType("Double");
                }
                // 如果是整形
                else if (ss != null && ss.length == 1 && Integer.parseInt(ss[0]) <= 10) {
                    column.setJavaType("Integer");
                }
                // 长整形
                else {
                    column.setJavaType("Long");
                }
            } else {
                column.setJavaType("String");
            }

            // 设置java属性名
            column.setJavaField(StringUtils.toCamelCase(column.getName()));

            // 是否是主键
            if (StringUtils.equalsIgnoreCase(column.getName(), "id")) {
                column.setIsPk("1");
            } else {
                column.setIsPk("0");
            }

            // 插入字段
            column.setIsInsert("1");

            // 编辑字段
            if (!StringUtils.equalsIgnoreCase(column.getName(), "id")
                    && !StringUtils.equalsIgnoreCase(column.getName(), "create_by")
                    && !StringUtils.equalsIgnoreCase(column.getName(), "create_date")
                    && !StringUtils.equalsIgnoreCase(column.getName(), "del_flag")
                    && !StringUtils.equalsIgnoreCase(column.getName(), "sort")) {
                column.setIsEdit("1");
            }


            // 列表字段
            if (StringUtils.equalsIgnoreCase(column.getName(), "remarks")
                    || StringUtils.equalsIgnoreCase(column.getName(), "update_date")) {
                column.setIsList("1");
            }

            // 设置特定类型和字段名

            // 用户
            if (StringUtils.startsWithIgnoreCase(column.getName(), "user_id")) {
                column.setJavaType(User.class.getName());
                column.setJavaField(column.getJavaField().replaceAll("Id", ".id|name"));
                column.setShowType("userselect");
            }
            // 部门
            else if (StringUtils.startsWithIgnoreCase(column.getName(), "office_id")) {
                column.setJavaType(Office.class.getName());
                column.setJavaField(column.getJavaField().replaceAll("Id", ".id|name"));
                column.setShowType("officeselect");
            }
            // 区域
            else if (StringUtils.startsWithIgnoreCase(column.getName(), "area_id")) {
                column.setJavaType(Area.class.getName());
                column.setJavaField(column.getJavaField().replaceAll("Id", ".id|name"));
                column.setShowType("areaselect");
            }
            // 创建者、更新者
            else if (StringUtils.startsWithIgnoreCase(column.getName(), "create_by")
                    || StringUtils.startsWithIgnoreCase(column.getName(), "update_by")) {
                column.setJavaType(User.class.getName());
                column.setJavaField(column.getJavaField() + ".id");
            }
            // 创建时间、更新时间
            else if (StringUtils.startsWithIgnoreCase(column.getName(), "create_date")
                    || StringUtils.startsWithIgnoreCase(column.getName(), "update_date")) {
                column.setShowType("dateselect");
            }

            // 备注
            else if (StringUtils.equalsIgnoreCase(column.getName(), "remarks")) {
                column.setShowType("textarea");
            }

            // 删除标记
            else if (StringUtils.equalsIgnoreCase(column.getName(), "del_flag")) {
                column.setShowType("radiobox");
                column.setDictType("del_flag");
            }

            genTableColumnList.add(column);
        });
        return genTableColumnList;
    }


    /**
     * 获得当前业务表的字段
     * @param tableColumn
     * @return
     */
    public List<GenTableColumn> findTableColumnList(GenTableColumn tableColumn) {
        return genTableColumnDao.findList(tableColumn);
    }

    /**
     * 删除相关字段（物理删除）
     * @param deleteByGenTableId
     */

    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public void deleteByGenTableId(String deleteByGenTableId) {
        genTableColumnDao.deleteByGenTableId(deleteByGenTableId);
    }

    /**
     * 向业务字段表增加数据
     * @param tableColumn
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public void save(GenTableColumn tableColumn) {
        if (tableColumn.getQueryType().equals(">")) {
            tableColumn.setQueryType("&gt;");
        }
        if (tableColumn.getQueryType().equals("<")) {
            tableColumn.setQueryType("&lt;");
        }
        if (tableColumn.getIsNewRecord()) {
            tableColumn.setIsNewRecord(false);
            tableColumn.preInsert();
            genTableColumnDao.insert(tableColumn);
        } else {
            tableColumn.preUpdate();
            genTableColumnDao.update(tableColumn);
        }
    }

    /**
     * 更新字段设置表
     * @param tableColumn
     */
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public void update(GenTableColumn tableColumn) {
        if (tableColumn.getQueryType().equals(">")) {
            tableColumn.setQueryType("&gt;");
        }
        if (tableColumn.getQueryType().equals("<")) {
            tableColumn.setQueryType("&lt;");
        }
            tableColumn.preUpdate();
            genTableColumnDao.update(tableColumn);
    }

}
